给一个长度为n的序列,问其连续子序列和大于等于s的最短长度。
先预处理S[i],两个指针扫,一个指向当前下标,另一个指向使s[i]-s[j]大于等于s且i-j最短的位置。
注意样例是错的,注意长度为n也不能满足条件的情况,输出0。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| #include <cstdio> #include <cmath> #include <cstring> #include<stdio.h> #include<cstring> #include<algorithm> #include<string.h> #include<iostream> #include<cmath> #include<map> #include<queue> using namespace std; #define mem(x,y) memset(x,y,sizeof(x)) #define inf 10000000 #define debug puts("-----") #define maxn 4000+6 #define NV 1000 #define NE 10000 #define LL long long int a[100000+3]; int main() { int n,s; while(~scanf("%d%d",&n,&s)) { int ans=inf; a[0]=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); a[i]+=a[i-1]; } int j=0; for(int i=1;i<=n;i++) { if(a[i]-a[j]<s)continue; while(a[i]-a[j]>=s) j++; j--; ans=min(i-j,ans); } printf("%d\n",ans==inf?0:ans); } }
|
EOF